package com.rj.ability.leqi.adapter.domain.aisino;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.rj.ability.leqi.req.CxrxxData;
import com.rj.core.constant.DateFormat;
import com.rj.core.constant.DigitsEnum;
import com.rj.core.constant.RegexpPool;
import com.rj.core.validation.constraints.DateField;
import com.rj.core.validation.constraints.DigitsField;
import com.rj.core.validation.constraints.StringField;
import com.rj.util.AssertUtils;
import com.rj.util.VerifyUtils;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;

import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 出行人信息
 *
 * @author YFX_RANLUBO
 * @date 2024/04/30 15:42
 **/
@Data
@AutoMapper(target = CxrxxData.class, reverseConvertGenerate = false)
public class AisinoCxrxxData {

    /**
     * 出行人序号 Number 8 否
     */
    @JsonProperty("travelersID")
    @DigitsField(value = "出行人序号", maxInteger = 8, maxFraction = 0, digitsEnum = DigitsEnum.POSITIVE)
    private String cxrxh;
    /**
     * 出行人 varchar 20 否
     */
    @JsonProperty("travelers")
    @StringField(value = "出行人", maxLen = 20)
    private String cxr;
    /**
     * 出行人证件类型 varchar 20 否 100：单位 101：组织机构 代码证 102：营业执照 103：税务登记证
     * 199：其他单位证件 200：个人 201：居民身份 证 202：军官证 203：武警警官 证 204：士兵证
     * 205：军队离退 休干部证 206：残疾人证 207：残疾军人 证（1-8 级） 208：外国护照
     * 209：港澳同胞 回乡证 210：港澳居民 来往内地通行 证 211：台胞证
     * 212：中华人民 共和国往来港 澳通行证 213：台湾居民 来往大陆通行 证
     * 214：大陆居民 往来台湾通行 证 215：外国人居 留证 216：外交官证
     * 217：使（领事） 馆证 218：海员证 219：香港永久 性居民身份证
     * 220：台湾身份 证 221：澳门特别 行政区永久性 居民身份证
     * 222：外国人身 份证件 223：高校毕业 生自主创业证 224：就业失业登记证 225：退休证
     * 226：离休证 227：中国护照 228：城镇退役士兵自谋职业证
     * 229：随军家属 身份证明 230：中国人民 解放军军官转业证书
     * 231：中国人民 解放军义务兵 退出现役证 232：中国人民 解放军士官退出役证 233：外国人永 久居留身份证 （外国人永久 居留证） 234：就业创业 证
     * 235：香港特别 行政区护照 236：澳门特别 行政区护照 237：中华人民 共和国港澳居 民居住证
     * 238：中华人民 共和国台湾居 民居住证 239：《中华人 民共和国外国 人 工 作 许 可 证》（A 类）
     * 240：《中华人 民共和国外国人工作许可证》（B 类）
     * 241：《中华人 民共和国外国人工作许可证》（C 类） 291：出生医学 证明 299：其他个人证件
     */
    @JsonProperty("travelersIDtype")
    private String cxrzjlxDm;
    /**
     * 有效身份证件号 varchar 20 否
     */
    @JsonProperty("validIDnum")
    @StringField(value = "有效身份证件号", maxLen = 20)
    private String sfzjhm;
    /**
     * 出行日期 date 否 格式： yyyy-MM-dd
     */
    private String travelDate;
    /**
     * 出行日期 date 否 格式： yyyy-MM-dd
     */
    @DateField(value = "出行日期", dateFormat = {DateFormat.YYYY_MM_DD})
    private String chuxrq;
    /**
     * 旅客出发地 varchar 80 否
     */
    @StringField(value = "旅客出发地", maxLen = 80)
    @JsonProperty("passengerDeparturePlace")
    private String cfd;
    /**
     * 旅客到达地 varchar 80 否
     */
    @StringField(value = "旅客到达地", maxLen = 80)
    @JsonProperty("passengersDestination")
    private String ddd;
    /**
     * 等级 varchar 20 否
     * 交通工具为 火车时： 一等座 二等座 软席（软座、 软卧） 硬席（硬座、 硬卧）
     * 交通工作为 飞机时： 公务舱 头等舱 经济舱
     * 交通工具为船舶（不包括旅游船）时： 一等舱 二等舱 三等舱
     */
    @JsonProperty("grade")
    private String zwdj;
    /**
     * 交通工具类型 varchar 80 否
     * 1：飞机 2：火车 3：长途汽车 4：公共交通 5：出租车 6：汽车 7：船舶 9：其他
     */
    @JsonProperty("vehicleTypes")
    @StringField(value = "交通工具类型", maxLen = 80, dict = {"1", "2", "3", "4", "5", "6", "7", "9"})
    private String jtgjlxDm;

    public void check() {
        if ("1".equals(jtgjlxDm)) {    //飞机
            AssertUtils.in(false, "等级", zwdj, "公务舱", "头等舱", "经济舱");
        } else if ("2".equals(jtgjlxDm)) {   //火车  席软 硬席
            AssertUtils.in(false, "等级", zwdj, "一等座", "二等座", "软座", "软卧", "硬座", "硬卧");
        } else if ("7".equals(jtgjlxDm)) {//船舶
            AssertUtils.in(false, "等级", zwdj, "一等舱", "二等舱", "三等舱");
        } else {
            AssertUtils.maxLen(true, "等级", zwdj, 20);
        }
        VerifyUtils.validDate(true, chuxrq, DateFormat.YYYYMMDDHHMMSS, (t) -> chuxrq = DateTimeFormatter.ofPattern(DateFormat.YYYY_MM_DD).format(t));
        AssertUtils.match(true, "有效身份证件号", sfzjhm, RegexpPool.SFZJHM);
        AssertUtils.match(sfzjhm == null, "出行人证件类型", cxrzjlxDm, RegexpPool.ZJHM_LX);
    }

}
